package maumau;

import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
import jade.lang.acl.MessageTemplate;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Random;

/**
 *
 * @author Malte
 */
public class Administrator extends Agent {
    private String[] strKartenFarbe = {"K", "P", "H", "C"};
    private String[] strKarte = {"7", "8", "9", "Z", "B", "D", "K", "A"};
    private ArrayList<AID> aidSpielerList = new ArrayList<AID>();
    private ArrayList<String> gespKarten = new ArrayList<String>();
    private Hashtable hashKarten = new Hashtable();
    private Hashtable hashKartenZu = new Hashtable();
    private String strTischKarte = "";
    
    protected void setup() {
        hashKarten.put("K7", "");
        hashKarten.put("K8", "");
        hashKarten.put("K9", "");
        hashKarten.put("KZ", "");
        hashKarten.put("KB", "");
        hashKarten.put("KD", "");
        hashKarten.put("KK", "");
        hashKarten.put("KA", "");
        hashKarten.put("P7", "");
        hashKarten.put("P8", "");
        hashKarten.put("P9", "");
        hashKarten.put("PZ", "");
        hashKarten.put("PB", "");
        hashKarten.put("PD", "");
        hashKarten.put("PK", "");
        hashKarten.put("PA", "");
        hashKarten.put("H7", "");
        hashKarten.put("H8", "");
        hashKarten.put("H9", "");
        hashKarten.put("HZ", "");
        hashKarten.put("HB", "");
        hashKarten.put("HD", "");
        hashKarten.put("HK", "");
        hashKarten.put("HA", "");
        hashKarten.put("C7", "");
        hashKarten.put("C8", "");
        hashKarten.put("C9", "");
        hashKarten.put("CZ", "");
        hashKarten.put("CB", "");
        hashKarten.put("CD", "");
        hashKarten.put("CK", "");
        hashKarten.put("CA", "");
        System.out.println("Administrator bereit. Spieler können sich anmelden!");
        addBehaviour(new SpielerAnmelden());
    }
    
    private class SpielerAnmelden extends CyclicBehaviour {
        @Override
        public void action() {
            MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.REQUEST);
            ACLMessage msg = myAgent.receive(mt);
            if(msg != null) {
                aidSpielerList.add(msg.getSender());
                System.out.println("Spieler "+msg.getSender().getLocalName().toString()+" hat sich angemeldet");
                ACLMessage msgrt = new ACLMessage(ACLMessage.REQUEST);
                msgrt.addReceiver(msg.getSender());
                if(aidSpielerList.size() == 1) {
                    msgrt.setOntology("Du machst den Anfange");
                    msgrt.setContent("Anfang");
                }
                else{
                    msgrt.setOntology("Du musst warten!");
                    msgrt.setContent("Warten");
                }
                send(msgrt);
                if(aidSpielerList.size() == 4){
                    addBehaviour(new KartenVerteilen());
                }
            }
            else{
                block();
            }
        }
    }
    
    private class KartenVerteilen extends OneShotBehaviour {
        @Override
        public void action() {
            int intSpieler = 0;
            int intAnzahlKarten;
            int intKartenFarbe = 0;
            int intKartenArt = 0;
            String strHand = "";
            String Karte;
            while (intSpieler < 4) {
                strHand = "";
                intAnzahlKarten=1;
                while (intAnzahlKarten <=5) {
                    intKartenFarbe = (int) (Math.random()*strKartenFarbe.length);
                    intKartenArt = (int) (Math.random()*strKarte.length);
                    Karte = strKartenFarbe[intKartenFarbe]+strKarte[intKartenArt];
                    if (hashKarten.get(Karte) == "") {
                        hashKarten.put(Karte, getAID().getLocalName());
                        intAnzahlKarten = intAnzahlKarten + 1;
                        strHand = strHand+Karte+";";
                    }
                }
                strHand = strHand.substring(0, strHand.length()-1);
                ACLMessage msg = new ACLMessage(ACLMessage.INFORM);
                msg.addReceiver(aidSpielerList.get(intSpieler));
                msg.setContent(strHand);
                msg.setOntology("Karten");
                send(msg);
                intSpieler = intSpieler + 1;
            }
            while ("".equals(strTischKarte)){
                intKartenFarbe = (int) (Math.random()*strKartenFarbe.length);
                intKartenArt = (int) (Math.random()*strKarte.length);
                Karte = strKartenFarbe[intKartenFarbe] + strKarte[intKartenArt];
                if (hashKarten.get(Karte) == "") {
                    hashKarten.remove(Karte);
                    strTischKarte = Karte;
                }
            }
        }
    }
    
    private class Spielen extends CyclicBehaviour {
        @Override
        public void action() {
            String Karte;
            String strKartenpruefer;
            int intKartenFarbe;
            int intKartenArt;
            MessageTemplate mt = MessageTemplate.MatchPerformative(ACLMessage.INFORM);
            ACLMessage msg = myAgent.receive();
            if (msg != null){
                if(hashKarten.isEmpty()){
                    hashKarten = hashKartenZu;
                }
                System.out.println("Tischkarte: "+strTischKarte);
                ACLMessage msgrt = new ACLMessage(ACLMessage.CFP);
                if (msg.getSender().getLocalName() == hashKarten.get(msg.getContent())) {
                    Karte = msg.getContent();
                    if (Karte.substring(0, 1).equals(strTischKarte.substring(0, 1)) || Karte.substring(1, 2).equals(strTischKarte.substring(1, 2))) {
                        strTischKarte = Karte;
                        hashKartenZu.put(Karte, "");
                    }
                    else {
                        System.out.println("Schummelversuch eine Strafkarte.");
                        while("".equals(Karte)){
                            intKartenFarbe = (int) (Math.random()*strKartenFarbe.length);
                            intKartenArt = (int) (Math.random()*strKarte.length);
                            Karte = strKartenFarbe[intKartenFarbe] + strKarte[intKartenArt];
                            if (hashKarten.get(Karte) == "") {
                                hashKarten.remove(Karte);
                                msgrt.addReceiver(msg.getSender());
                                msgrt.setOntology(Karte);
                                msgrt.setContent(Karte);
                                send(msgrt);
                            }
                            
                        }
                    }
                }
                else if (msg.getContent()== "pass" || msg.getSender().getLocalName() != hashKarten.get(msg.getContent())){
                    Karte = "";
                    while ("".equals(Karte)){
                        intKartenFarbe = (int) (Math.random()*strKartenFarbe.length);
                        intKartenArt = (int) (Math.random()*strKarte.length);
                        Karte = strKartenFarbe[intKartenFarbe] + strKarte[intKartenArt];
                        if (hashKarten.get(Karte) == "") {
                            hashKarten.remove(Karte);
                            msgrt.addReceiver(msg.getSender());
                            msgrt.setOntology(Karte);
                            msgrt.setContent(Karte);
                            send(msgrt);
                        }
                        else{
                            Karte = "";
                        }
                    }
                }
            }
            else{
                block();
            }
        }
    }
    
    
}
